package pl.edu.pk.psb.validator;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import pl.edu.pk.psb.bc.ds.TrasaDs;
import pl.edu.pk.psb.command.PolaczenieCommand;
import pl.edu.pk.psb.command.TrasaCommand;

@Component
public class PolaczenieValidator extends OgolnyValidator implements Validator {

	@Override
	public void validate(Object obiekt, Errors bledy) {
		PolaczenieCommand command = (PolaczenieCommand) obiekt;
		if (command.getNazwa().length() == 0) {
			bledy.rejectValue("nazwa", "walidacja.pusta");
		}
		if (!czyPoprawnyDzienTygodznia(command.getDniKursowania())) {
			bledy.rejectValue("dniKursowania", "walidacja.dniKursowania");
		}
		if (!czyPoprawnaGodzina(command.getListaPrzystankow())) {
			bledy.rejectValue("listaPrzystankow", "walidacja.godziaKursowania");
		}
		if (!czyLiczbaPrzystWiekszaOdDwoch(command.getListaPrzystankow())) {
			bledy.rejectValue("listaPrzystankow", "walidacja.liczbaPrzystankow");
		}
	}

	private boolean czyLiczbaPrzystWiekszaOdDwoch(
			List<TrasaCommand> listaPrzystankow) {
		if (listaPrzystankow.size() < 2)
			return false;
		else
			return true;
	}

	private boolean czyPoprawnaGodzina(List<TrasaCommand> listaPrzystankow) {
		boolean czyPoprawna = true;
		Integer godzinaPrzyjazdu = null;
		Integer minutaPrzyjazdu = null;
		Integer godzinaOdjazdu = null;
		Integer minutaOdjazdu = null;
		for (TrasaCommand t : listaPrzystankow) {
			try {
				godzinaPrzyjazdu = Integer.parseInt(t.getGodzinaPrzyjazdu());
				if (godzinaPrzyjazdu > 24) {
					czyPoprawna = false;
					break;
				}

				minutaPrzyjazdu = Integer.parseInt(t.getMinutaPrzyjazdu());
				if (minutaPrzyjazdu > 60) {
					czyPoprawna = false;
					break;
				}

				godzinaOdjazdu = Integer.parseInt(t.getGodzinaOdjazdu());
				if (godzinaOdjazdu > 24) {
					czyPoprawna = false;
					break;
				}

				minutaOdjazdu = Integer.parseInt(t.getMinutaOdjazdu());
				if (minutaOdjazdu > 60) {
					czyPoprawna = false;
					break;

				}
			} catch (Exception e) {
				czyPoprawna = false;
				break;
			}
		}
		return czyPoprawna;
	}

	private boolean czyPrzystankiBezPowtorzen(List<TrasaCommand> przystanki) {
		boolean czyBezPowtorzen = false;
		List<Integer> p = new ArrayList<Integer>();
		for (TrasaCommand c : przystanki) {
			p.add(c.getIdPrzystanku());
		}
		Set<Integer> trasa = new HashSet<Integer>(p);
		if (p.size() == trasa.size()) {
			czyBezPowtorzen = true;
		}
		return czyBezPowtorzen;
	}

	private boolean czyPoprawnyDzienTygodznia(boolean[] dniKursowania) {
		boolean czyZaznaczono = false;
		for (boolean z : dniKursowania) {
			if (z == true) {
				czyZaznaczono = true;
				break;
			}
		}
		return czyZaznaczono;
	}

	@Override
	public boolean supports(Class<?> klasa) {
		return PolaczenieCommand.class.isAssignableFrom(klasa);
	}

}
